package view;

import java.awt.Cursor;
import java.awt.Rectangle;
import java.awt.event.ComponentListener;

import controller.ChatListener;

/**
 * Gibt die zu implementierenden Methoden fuer alle Klassen (insbesondere
 * Kindklassen von JPanel) vor, die einen Chat mittels {@link ChatListener}
 * umsetzen.
 * 
 * @author Kilian Telschig
 * 
 */
public interface ChatContainer {

	/*
	 * der Chat wird ja spaeter u.U. nicht mehr das gesamte JPanel ausfuellen,
	 * daher muss der ChatListener die Shapes dynamisch anpassen.
	 */

	/**
	 * Gibt die Position und Groesse des Chats relativ zu diesem ChatContainer
	 * an. Wird von der Klasse ChatListener bei resize-Action auf diesem
	 * ChatContainer aufgerufen, um das ChatModel zu informieren, sodass Font
	 * und Layout angepasst werden.
	 * 
	 * @return Position und Groesse des Chats relativ zu diesem ChatContainer
	 *         als Rectangle
	 */
	public abstract Rectangle computeChatRect();

	/**
	 * Fuegt diesem ChatContainer einen ComponentListener hinzu. Diese Methode
	 * wird vom ChatListener dazu benutzt, um ueber einen Resize informiert zu
	 * werden.
	 * 
	 * @param l
	 *            hinzuzufuegender ComponentListener
	 */
	public abstract void addComponentListener(ComponentListener l);

	/**
	 * Zeichnet diesen ChatContainer neu. Insbesondere sollte diese Mehtode eine
	 * Aufruf der Methode
	 * {@link model.ChatModel#zeichneChat(java.awt.Graphics, int, int, int, int)
	 * ChatModel.zeichneChat} bewirken.
	 */
	public abstract void repaint();

	/**
	 * Zeichnet den durch das gegebene Rectangle repraesentierten Bereich dieses
	 * ChatContainers neu.
	 * 
	 * @param r
	 *            neu zu zeichnender Bereich
	 */
	public abstract void repaint(Rectangle r);

	/**
	 * Aendert den Cursor dieses ChatContainers.
	 * 
	 * @param c
	 *            neuer Cursor
	 */
	public abstract void setCursor(Cursor c);
}
